#include <iostream>
#include <memory>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
using std::shared_ptr;
//共享所有权的智能指针的使用

void test(){
    shared_ptr<int> sp(new int(20));
    cout << sp.get() << endl;
    cout << *sp << endl;
    cout << sp.use_count() << endl;
    //进行一个拷贝操作
    cout << "进行拷贝操作" << endl;
    shared_ptr<int> sp2 = sp;
    cout << sp.use_count() << endl;
    cout << sp2.get() << endl;
    cout << *sp2 << endl;
    cout << sp2.use_count() << endl;
    //进行赋值操作
    cout << "进行赋值操作" << endl;
    shared_ptr<int> sp3(new int(100));
    cout << sp3.use_count() << endl;
    sp3 = sp2;
    cout << sp.use_count() << endl;
    cout << sp2.use_count() << endl;
    cout << sp3.use_count() << endl;
}

void test2(){
    //作为容器的元素
    shared_ptr<int> sp(new int(20));
    vector<shared_ptr<int>> vec;
    //会不会报错呢？？？？？
    //如何判断会不会呢？？？？这里需要拷贝sp
    //所以需要查看sp是否具有拷贝构造函数
    //此时执行的是一个深拷贝操作
    //无论是vec里面的sp还是外部的sp都可以正常使用
    vec.push_back(sp);//ok
    vec.push_back(std::move(sp));
    vec.push_back(shared_ptr<int>(new int(30)));
    //cout << *sp << endl;error
    cout << *vec[0] << endl;
    cout << *vec[1] << endl;
}

int main()
{
    test2();
    return 0;
}

